home *** CD-ROM | disk | FTP | other *** search
/ 10,000 Great Games / 10,000 Great Games.iso / Product / 66 / data1.cab / Source_Files / Src / Ddraw.cpp < prev    next >
C/C++ Source or Header  |  2000-01-16  |  6KB  |  220 lines

  1. #include "stdafx.h"
  2.  
  3. LPDIRECTDRAW4 DD = 0;
  4. DDPIXELFORMAT pixelformat;
  5. DDCAPS hardware_caps;
  6. LPDIRECTDRAWSURFACE4 screen = 0, backbuffer = 0;
  7. LPDIRECTDRAWPALETTE palette = 0;
  8. LPDIRECTDRAWCLIPPER clipper = 0;
  9. LPPALETTEENTRY rgb_table = 0;
  10. int color_table_this_mode[256];
  11. int black, gray, white, red, green, blue, yellow, mask_color;
  12. int inawin = TRUE, no_blit_hardware = FALSE, hardware_blit_caps = FALSE, no_parallax = FALSE;
  13. double gamma;
  14.  
  15. static void init_directdraw()
  16. {
  17.     LPDIRECTDRAW DD1;
  18.  
  19.     // Get the DirectDraw4 object
  20.     
  21.     if (FAILED(DirectDrawCreate(0, &DD1, 0)))
  22.         error("Unable to create DirectDraw interface\n\n"
  23.                "Did you install DirectX 6.0 or higher?\n\n"
  24.                "Do you have a video card/driver that can handle 640x480 at 256 colors?");
  25.     
  26.     if (FAILED(DD1->QueryInterface(IID_IDirectDraw4, (LPVOID *)&DD)))
  27.         error("Unable to get the DirectDraw4 interface\n\n"
  28.               "Did you install DirectX 6.0 or higher?\n\n"
  29.               "Do you have a video card/driver that can handle 640x480 at 256 colors?");
  30.     
  31.     DD1->Release();
  32.  
  33.     // Get hardware capabilities
  34.  
  35.     hardware_caps.dwSize = sizeof(hardware_caps);
  36.  
  37.     if (FAILED(DD->GetCaps(&hardware_caps, 0)))
  38.         error("Unable to get hardware capabilities");
  39.     
  40.     // Do we want to use hardware blitting?
  41.  
  42.     hardware_blit_caps = hardware_caps.dwCaps & DDCAPS_BLT && 
  43.                          (hardware_caps.dwCaps & DDCAPS_COLORKEY) && 
  44.                          (hardware_caps.dwCKeyCaps & DDCKEYCAPS_SRCBLT);
  45. }
  46.  
  47. void gamma_correct(BYTE &value)
  48. {
  49.     value = (BYTE)(pow(255, 1 - gamma) * pow(value, gamma) + 0.5);
  50. }
  51.  
  52. static void init_palette()
  53. {
  54.     // Get pixelformat of current mode
  55.     
  56.     pixelformat.dwSize = sizeof(pixelformat);
  57.     
  58.     if (FAILED(screen->GetPixelFormat(&pixelformat)))
  59.         error("Unable to get pixelformat of current video mode");
  60.  
  61.     // Load game palette
  62.     
  63.     rgb_table = (PALETTEENTRY *)read_part_file("BLASTER.PAL", 24, 1024);    
  64.  
  65.     // Do gamma correction
  66.  
  67.     for (int i = 0; i < 256; i++)
  68.     {
  69.         gamma_correct(rgb_table[i].peRed);
  70.         gamma_correct(rgb_table[i].peGreen);
  71.         gamma_correct(rgb_table[i].peBlue);
  72.     }
  73.  
  74.     // Do some palette things when we're in palette mode
  75.     
  76.     if (pixelformat.dwFlags & DDPF_PALETTEINDEXED8 && !inawin)
  77.     {    
  78.         // Create the palette
  79.         
  80.         if (FAILED(DD->CreatePalette(DDPCAPS_8BIT | DDPCAPS_ALLOW256, rgb_table, &palette, 0)))
  81.             error("Unable to make a 256 color palette");
  82.  
  83.         // Set game palette
  84.  
  85.         screen->SetPalette(palette);
  86.     }
  87.     
  88.     // Get standard colors
  89.  
  90.     mask_color = match_color(PINK);
  91.     black = match_color(BLACK);
  92.     gray = match_color(GRAY);
  93.     white = match_color(WHITE);
  94.     red = match_color(RED);
  95.     green = match_color(GREEN);
  96.     blue = match_color(BLUE);
  97.     yellow = match_color(YELLOW);                
  98.  
  99.     // Get translation table for this mode
  100.     
  101.     for (int c = 0; c < 256; c++)
  102.         color_table_this_mode[c] = match_color(RGB(getr(c), getg(c), getb(c)));
  103. }
  104.  
  105. void init_directdraw_inawin()
  106. {
  107.     init_directdraw();
  108.     
  109.     // Be nice
  110.     
  111.     if (FAILED(DD->SetCooperativeLevel(0, DDSCL_NORMAL)))
  112.         error("Unable to set cooperative level for screen");
  113.  
  114.     // Setup primary surface
  115.     
  116.     DDSURFACEDESC2 ddsd;
  117.     
  118.     ZeroMemory(&ddsd, sizeof(ddsd));
  119.     ddsd.dwSize = sizeof(ddsd);
  120.     ddsd.dwFlags = DDSD_CAPS;
  121.     ddsd.ddsCaps.dwCaps = DDSCAPS_PRIMARYSURFACE;
  122.     
  123.     if (FAILED(DD->CreateSurface(&ddsd, &screen, 0)))
  124.         error("Unable to create primary surface");
  125.     
  126.     // Make a backbuffer
  127.     
  128.     if ((backbuffer = create_surface(SCREEN_X, SCREEN_Y, no_blit_hardware || !hardware_blit_caps? DDSCAPS_SYSTEMMEMORY : 0, 0)) == 0)
  129.         error("Unable to create backbuffer");                    
  130.  
  131.     init_palette();
  132. }
  133.  
  134. void init_directdraw_clipper()
  135. {
  136.     // Attach a clipper to our window
  137.     
  138.     if (FAILED(DD->CreateClipper(0, &clipper, 0)))
  139.         error("Unable to make clipper");
  140.     
  141.     if (FAILED(clipper->SetHWnd(0, gamewindowhandle)))
  142.         error("Unable to associate clipper with main window");
  143.     
  144.     if (FAILED(screen->SetClipper(clipper)))
  145.         error("Unable to associate clipper with directdraw primary surface");    
  146. }
  147.  
  148. void init_directdraw_notinawin()
  149. {
  150.     init_directdraw();
  151.  
  152.     // Set display mode and cooperative level
  153.     
  154.     if (FAILED(DD->SetCooperativeLevel(mainwindowhandle, DDSCL_FULLSCREEN | DDSCL_EXCLUSIVE | DDSCL_ALLOWREBOOT)))
  155.         error("Unable to acquire the whole screen.");
  156.     
  157.     if (FAILED(DD->SetDisplayMode(SCREEN_X, SCREEN_Y, 8, 0, 0)))
  158.         error("Unable to set video mode to 640x480x8\n"
  159.         "You may need to install the correct driver for your display card/monitor.");
  160.     
  161.     // Setup primary surface
  162.     
  163.     DDSURFACEDESC2 ddsd;    
  164.     
  165.     ZeroMemory(&ddsd, sizeof(ddsd));
  166.     ddsd.dwSize = sizeof(ddsd);
  167.     ddsd.dwFlags = DDSD_CAPS | DDSD_BACKBUFFERCOUNT;
  168.     ddsd.ddsCaps.dwCaps = DDSCAPS_PRIMARYSURFACE | DDSCAPS_FLIP | DDSCAPS_COMPLEX;
  169.     ddsd.dwBackBufferCount = 1;
  170.     
  171.     if (FAILED(DD->CreateSurface(&ddsd, &screen, 0)))        
  172.         error("Unable to create primary surface!");
  173.     
  174.     clear(screen, 0);
  175.  
  176.     // Get the backbuffer
  177.     
  178.     DDSCAPS2 ddscaps;
  179.     ddscaps.dwCaps = DDSCAPS_BACKBUFFER;
  180.     
  181.     if (FAILED(screen->GetAttachedSurface(&ddscaps, &backbuffer)))
  182.         error("Unable to get backbuffer for primary surface");        
  183.  
  184.     init_palette();    
  185. }
  186.  
  187. void deinit_directdraw()
  188. {
  189.     safe_release(&clipper);
  190.     safe_release(&backbuffer);
  191.     safe_release(&screen);
  192.     safe_release(&palette);
  193.     safe_delete(&rgb_table);
  194.     safe_release(&DD);    
  195. }
  196.  
  197. int draw_ok(HRESULT result)
  198. {
  199.     switch(result)
  200.     {
  201.     case DD_OK:
  202.         return TRUE;
  203.     
  204.     case DDERR_SURFACELOST:        
  205.         if (FAILED(DD->RestoreAllSurfaces()))
  206.             error("Unable to restore surfaces!");                
  207.         
  208.         return FALSE;
  209.  
  210.     case DDERR_WRONGMODE:
  211.         error("Video mode changed!");
  212.     }
  213.  
  214.     ASSERT(result != DDERR_INVALIDRECT);
  215.     ASSERT(result != DDERR_INVALIDPARAMS);
  216.     ASSERT(FALSE);
  217.  
  218.     return TRUE;
  219. }
  220.